#ifndef __POS_COVERT_H__
#define __POS_COVERT_H__

#include "Marcos.h"
#include <vector>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <cstring>
#include <functional>
#include <map>
#include "spdlog/spdlog.h"
#include <fstream>
#include <sstream>
#include <string>

#include "Logger.h"

using namespace std;



class PosConvert {

public:

    PosConvert():logger_(LogMan::instance()) 
    {
        OriPts.ex = 1;
        OriPts.ey = 2;
        OriPts.ez_1 = 3;
        OriPts.ez_2 = 4;
        OriPts.erx = 5;
        OriPts.erz = 6;

        logger_->trace("Clase PosConvert construct succ~~ ");
    }

    virtual ~PosConvert() {
        
        if (logger_) {
            logger_->flush(); // 显式刷新缓冲区
        }
    }

    // 分割字符串函数
    vector<string> split(const string& s, char delimiter) 
    {
        vector<string> tokens;
        string token;
        istringstream tokenStream(s);

        while (getline(tokenStream, token, delimiter)) 
        {
            tokens.push_back(token);
        }
        return tokens;
    }

    int Save_Ori_Pts();

    int Load_Ori_Pts();


    int Set_OriPts(tpDNOriginEncoderStruct & ori);   //保存坐标原点

    const tpDNOriginEncoderStruct& Get_OriPts() const  //获取原点坐标
    {   return OriPts;  }

    std::pair<bool, const tpDNPositionStruct&> Get_Pos() const  //获取实时坐标
    {   
        return {Is_First_Get_Pos,rt_pos};

        // if (Is_First_Get_Pos) 
        // {   
        //     return rt_pos;  
        // }
        // else
        // {
        //     return std::nullopt; // 返回空值
        // }
    }

    const tpDNPositionStruct& Refresh_Init_Pos(int32_t* inc_enc,int32_t* abs_enc);  //获取初始位置 (mm,deg单位)

    const tpDNPositionStruct& Refresh_Rt_Pos(int32_t* inc_enc, int32_t* abs_enc);  //获取实时位置 (mm,deg单位)

    void Update_increment_enc_before_move(int32_t* inc_enc);

    const bool Is_1st_GetPos() const   //判断是否第一次获取位置
    { 
        return (Is_First_Get_Pos == false);
    }

    void Reset_First_Get_Pos()
    {
        Is_First_Get_Pos = false;
    }


private:


    static constexpr uint8_t NUM_MOTOR = 6;

    //----------保存原点坐标值文件路径-------------
    string ori_pt_file = "OriginPoints.txt";

    
    float offset_aix5 = 0;
    float offset_aix6 = 0;

    tpDNOriginEncoderStruct OriPts; //原点坐标

    tpDNPositionStruct init_pos;  //初始位置  (mm,deg单位)

    tpDNPositionStruct rt_pos;  //实时位置  (mm,deg单位)

    int32_t increment_enc_before_move[NUM_MOTOR];  //每次运动开始前用来存储起始增编值，后面用于实时的位置推算

    bool Is_First_Get_Pos = false;  //判断是否上电第一次获取位置，如果是第一次，则读取初始位置，读取初始位置后置为true

    std::shared_ptr<spdlog::logger> logger_;  // 日志器成员变量

};




#endif

